package com.ltcode.auth.domain.repository;

import com.ltcode.auth.domain.model.LoginSession;

import java.util.List;
import java.util.Optional;

/**
 * 登录会话仓储接口
 * 
 * @author ltcode
 * @since 2024-01-01
 */
public interface LoginSessionRepository {

    /**
     * 保存登录会话
     * 
     * @param session 会话信息
     * @return 保存后的会话信息
     */
    LoginSession save(LoginSession session);

    /**
     * 根据会话ID查询会话
     * 
     * @param sessionId 会话ID
     * @return 会话信息
     */
    Optional<LoginSession> findBySessionId(String sessionId);

    /**
     * 根据用户ID查询所有活跃会话
     * 
     * @param userId 用户ID
     * @return 会话列表
     */
    List<LoginSession> findActiveSessionsByUserId(Long userId);

    /**
     * 根据访问令牌查询会话
     * 
     * @param accessToken 访问令牌
     * @return 会话信息
     */
    Optional<LoginSession> findByAccessToken(String accessToken);

    /**
     * 删除会话
     * 
     * @param sessionId 会话ID
     */
    void deleteBySessionId(String sessionId);

    /**
     * 更新会话状态
     * 
     * @param sessionId 会话ID
     * @param status 新状态
     */
    void updateSessionStatus(String sessionId, LoginSession.SessionStatus status);

    /**
     * 更新最后访问时间
     * 
     * @param sessionId 会话ID
     */
    void updateLastAccessTime(String sessionId);

    /**
     * 踢出用户的所有会话
     * 
     * @param userId 用户ID
     */
    void kickAllSessionsByUserId(Long userId);

    /**
     * 踢出用户的其他会话（保留当前会话）
     * 
     * @param userId 用户ID
     * @param currentSessionId 当前会话ID
     */
    void kickOtherSessionsByUserId(Long userId, String currentSessionId);

    /**
     * 清理过期会话
     */
    void cleanExpiredSessions();

    /**
     * 检查会话是否存在
     * 
     * @param sessionId 会话ID
     * @return 是否存在
     */
    boolean existsBySessionId(String sessionId);

    /**
     * 统计用户的活跃会话数量
     * 
     * @param userId 用户ID
     * @return 活跃会话数量
     */
    long countActiveSessionsByUserId(Long userId);

    /**
     * 根据IP地址查询会话
     * 
     * @param loginIp 登录IP
     * @return 会话列表
     */
    List<LoginSession> findSessionsByLoginIp(String loginIp);

    /**
     * 设置会话过期时间
     * 
     * @param sessionId 会话ID
     * @param expireMinutes 过期分钟数
     */
    void setSessionExpireTime(String sessionId, long expireMinutes);
}
